gdk: Try harder at tracking drawing contexts
authorEmmanuele Bassi <ebassi@gnome.org>
Fri, 10 Jun 2016 16:00:29 +0000 (17:00 +0100)
committerEmmanuele Bassi <ebassi@gnome.org>
Sun, 12 Jun 2016 16:27:44 +0000 (17:27 +0100)
If gdk_cairo_create() is called within a frame draw operation, we can
still associate the Cairo context with a GdkDrawingContext.

gdk/gdkdrawingcontext.c
gdk/gdkinternals.h
gdk/gdkwindow.c

index 89d9b500b1974de363856c692908333a0a2475db..c082a155ccb7dbe56cf205e2a413b3c49e82b183 100644 (file)
@@ -180,7 +180,7 @@ gdk_drawing_context_init (GdkDrawingContext *self)
 
 static const cairo_user_data_key_t draw_context_key;
 
-static void
+void
 gdk_cairo_set_drawing_context (cairo_t           *cr,
                                GdkDrawingContext *context)
 {
index 255557f53ef58d35ae7acec9f337382b48e27401..33aca335ce8123340838f65a6ec9a1598261d9c8 100644 (file)
@@ -451,6 +451,8 @@ void            gdk_cairo_surface_mark_as_direct (cairo_surface_t *surface,
                                                   GdkWindow       *window);
 cairo_region_t *gdk_cairo_region_from_clip       (cairo_t         *cr);
 
+void            gdk_cairo_set_drawing_context    (cairo_t           *cr,
+                                                  GdkDrawingContext *context);
 
 /*************************************
  * Interfaces used by windowing code *
index 8abcddf12ffce1b4217a97e6be1829f47c2ef0a1..b9c58430e2995fbef6b18b72d5b38d99a65bf339 100644 (file)
@@ -3553,20 +3553,17 @@ gdk_cairo_create (GdkWindow *window)
 
   cr = cairo_create (surface);
 
-  if (window->impl_window->current_paint.region != NULL)
-    {
-      region = cairo_region_copy (window->impl_window->current_paint.region);
-      cairo_region_translate (region, -window->abs_x, -window->abs_y);
-    }
-  else
-    {
-      region = cairo_region_copy (window->clip_region);
-    }
-
+  region = gdk_window_get_current_paint_region (window);
   gdk_cairo_region (cr, region);
   cairo_region_destroy (region);
   cairo_clip (cr);
 
+  /* Assign a drawing context, if one is set; if gdk_cairo_create()
+   * is called outside of a frame drawing then this is going to be
+   * NULL.
+   */
+  gdk_cairo_set_drawing_context (cr, window->drawing_context);
+
   cairo_surface_destroy (surface);
 
   return cr;